package edu.cgpi.core.entidade;

import java.util.HashSet;
import java.util.Set;

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("Ponto")
public class Ponto implements FormaGeometrica {

	private Double x;
	private Double y;

	public Ponto(Double x, Double y) {
		this.x = x;
		this.y = y;
	}

	public Double getX() {
		return x;
	}

	public void setX(Double x) {
		this.x = x;
	}

	public Double getY() {
		return y;
	}

	public void setY(Double y) {
		this.y = y;
	}
	
	public Ponto obterLocalizacao() {
		return this;
	}
	
	public Set<Ponto> obterPontos() {
		Set<Ponto> pontos = new HashSet<Ponto>();
		pontos.add(this);
		return pontos;
	}

	public Double calcularDistancia(FormaGeometrica forma) {
		Ponto localizacaoDestaImagem = obterLocalizacao();
		Ponto localizacaoImagem = forma.obterLocalizacao();
		return Math.sqrt(Math.pow((localizacaoImagem.getY() - localizacaoDestaImagem.getY()), 2)
				+ Math.pow((localizacaoImagem.getX() - localizacaoDestaImagem.getX()), 2));
	}
	
	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("(");
		builder.append(getX());
		builder.append(", ");
		builder.append(getY());
		builder.append(")");
		return builder.toString();
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((x == null) ? 0 : x.hashCode());
		result = prime * result + ((y == null) ? 0 : y.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj != null) {
			if (obj instanceof Ponto) {
				Ponto outro = (Ponto) obj;
				if (x.equals(outro.getX())) {
					if (y.equals(outro.getY()))
						return true;
				}
			}
		}
		return false;
	}
}